package com.clp.inflxudb.core;

import com.clp.inflxudb.core.domain.FluxKVGroup;
import com.clp.inflxudb.core.domain.FluxPoint;
import com.clp.inflxudb.core.domain.TsRange;
import com.clp.inflxudb.core.flux_function.FluxFunction;
import com.influxdb.query.FluxTable;

import java.util.List;

/**
 * Handler的处理过程：
 *      1、设置查询时间范围 TsRange getRange();
 *      2、设置查询条件0（如果有） T getCondition0() {
 *      3、设置查询条件1（如果有） FluxKVGroup getCondition1() {
 *      4、设置函数（如果有） getFunction() {
 *      5、查到List<FluxTable>之后，做一些事（如果有） afterQuery(List<FluxTable> fluxTableList) {
 *      6、设置是否反向封装 boolean isReverseConvertFluxTable() {
 *      7、封装List<FluxTable>，封装之后做一些事（如果有） List<T> afterConvert(List<T> tList) {
 * @param <T>
 */
public interface FluxHandler<T extends FluxPoint> {
    /**
     * 获取时间戳范围
     * @return：时间戳范围
     */
    TsRange getRange();

    /**
     * 获取查询条件
     * @return：条件形式1
     */
    default T getCondition0() {
        return null;
    }

    /**
     * 获取查询条件1
     * @return：条件形式2
     */
    default FluxKVGroup getCondition1() {
        return null;
    }

    /**
     * 获取 FluxFunction
     * @return：FluxFunction函数
     */
    default FluxFunction getFunction() {
        return null;
    }

    /**
     * 查询到结果之后
     * @param fluxTableList：查询到的结果列表
     * @return：无
     */
    default void afterQuery(List<FluxTable> fluxTableList) {
    }

    /**
     * 是否反向封装
     * @return：是否反向封装
     */
    default boolean isReverseConvertFluxTable() {
        return false;
    }

    /**
     * 封装结果之后
     * @param tList：封装的结果列表
     * @return：处理后的结果列表
     */
    default List<T> afterConvert(List<T> tList) {
        return tList;
    }
}
